unit GerencialDM;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ZDataset, ZSqlUpdate, ZSequence, MainDM, QueryConditions, DB;

type

  { TGerencialData }

  TGerencialData = class(TMainDataModule)
    ContaPagarZQuerydata_pagamento: TDateField;
    ContaPagarZQuerydata_vencimento: TDateField;
    ContaPagarZQuerydesconto: TFloatField;
    ContaPagarZQueryid_conta: TLargeintField;
    ContaPagarZQueryid_duplicata_pagar: TLargeintField;
    ContaPagarZQueryid_entrada: TLargeintField;
    ContaPagarZQueryid_fornecedor: TLargeintField;
    ContaPagarZQueryid_plano_conta: TLargeintField;
    ContaPagarZQueryjuros: TFloatField;
    ContaPagarZQuerynome_pessoa: TStringField;
    ContaPagarZQuerynota: TStringField;
    ContaPagarZQueryparcela: TLargeintField;
    ContaPagarZQuerystatus: TStringField;
    ContaPagarZQueryvalor: TFloatField;
    ContaPagarZQueryvalor_pago: TFloatField;
    ContaReceberDatasource: TDatasource;
    ContaPagarDatasource: TDatasource;
    ContaPagarZQuery: TZQuery;
    ContaReceberZQueryacrescimo: TFloatField;
    ContaReceberZQuerydata_pagamento: TDateField;
    ContaReceberZQuerydata_vencimento: TDateField;
    ContaReceberZQuerydesconto: TFloatField;
    ContaReceberZQueryid_cliente: TLargeintField;
    ContaReceberZQueryid_conta: TLargeintField;
    ContaReceberZQueryid_duplicata_receber: TLargeintField;
    ContaReceberZQueryid_venda: TLargeintField;
    ContaReceberZQuerynome_pessoa: TStringField;
    ContaReceberZQuerynota: TStringField;
    ContaReceberZQueryparcela: TLargeintField;
    ContaReceberZQuerysigla_forma_pagamento: TStringField;
    ContaReceberZQuerystatus: TStringField;
    ContaReceberZQueryvalor: TFloatField;
    ContaReceberZQueryvalor_pago: TFloatField;
    LancamentoZQuerydespesa: TFloatField;
    LancamentoZQueryreceita: TFloatField;
    LancamentoZQuerytotal: TFloatField;
    ReceitaDespesaDatasource: TDatasource;
    LancamentoDatasource: TDatasource;
    LancamentoZQuery: TZQuery;
    AuxiliarZQuery: TZQuery;
    LancamentoZQuerydata: TDateField;
    LancamentoZQuerydesc_plano_conta: TStringField;
    LancamentoZQueryhora: TTimeField;
    LancamentoZQueryid_caixa_movimentacao: TLargeintField;
    LancamentoZQueryid_conta: TLargeintField;
    LancamentoZQueryid_plano_conta: TLargeintField;
    LancamentoZQueryid_plano_conta_movimentacao: TLargeintField;
    LancamentoZQueryid_usuario: TLargeintField;
    LancamentoZQuerytipo: TStringField;
    LancamentoZQueryvalor: TFloatField;
    ContaReceberZQuery: TZQuery;
    ReceitaDespesaZQuery: TZQuery;
    ReceitaDespesaZQuerymes: TFloatField;
    ReceitaDespesaZQuerysum: TFloatField;
    ReceitaDespesaZQuerytipo: TStringField;
    procedure DataModuleCreate(Sender: TObject);
    /// Abre o DataSet
    procedure OpenDataSet(); override;
    /// Fecha o DataSet
    procedure CloseDataSet(); override;
    /// Realiza busca
    /// @param(Condicoes são as condições para a busca)
    /// @param(Tabela é a tabela no banco de dados)
    procedure Search(Condicoes: TQueryConditions; Tabela: string); override;
    function BuscaData(): string;
    function BuscaAno(): string;
    procedure BuscaLancamentos(DataInicio: string; DataFim: string; IDConta: string);
    procedure BuscaContaReceber(DataInicio: string; DataFim: string; Tipo: string);
    procedure BuscaContaPagar(DataInicio: string; DataFim: string; Tipo: string);
    procedure BuscaReceitaDespesaAnual(Ano: string);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  GerencialData: TGerencialData;

implementation

uses ConnectionDM;

{ TGerencialData }

//SQl com Datas
//select Extract(Day from data)as dia from plano_conta_movimentacao
//select sum(valor)'2013-04-01' from plano_conta_movimentacao where data> '2013-04-01' and data< (date '2013-04-01' + interval '1 month' - interval '1' day)
//Pegar o ano Select Extract('Year' FROM Now());

procedure TGerencialData.DataModuleCreate(Sender: TObject);
begin
  MainDataSet := LancamentoZQuery;
end;

procedure TGerencialData.OpenDataSet;
begin
  // ConnectionData.EmptyQuery(LancamentoZQuery, '');
end;

procedure TGerencialData.CloseDataSet;
begin
  //LancamentoZQuery.Close();
end;

procedure TGerencialData.Search(Condicoes: TQueryConditions; Tabela: string);
begin
  ConnectionData.OpenQueryConditions(LancamentoZQuery, Tabela, Condicoes);
end;

function TGerencialData.BuscaData(): string;
var
  Data: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT current_date as date');
    Open();
    Edit();
    Data := FieldByName('date').AsString;
    Result := Data;
  end;
end;

function TGerencialData.BuscaAno: string;
begin
  with AuxiliarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select Extract(:ano FROM Now()) as ano');
    ParamByName('ano').AsString := 'Year';
    Result := FieldByName('ano').AsString;
  end;
end;

procedure TGerencialData.BuscaLancamentos(DataInicio: string;
  DataFim: string; IDConta: string);
var
  I: integer;
  SomaR,SomaD: real;
begin
  with LancamentoZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT pc.desc_plano_conta, pc.tipo, pcm.* from plano_conta_movimentacao as pcm, plano_conta as pc');
    SQL.Add('where pcm.data>=:data_inicio AND pcm.data<=:data_fim AND pcm.id_conta=:id_conta AND pcm.id_plano_conta=pc.id_plano_conta');
    ParamByName('data_inicio').AsString := DataInicio;
    ParamByName('data_fim').AsString := DataFim;
    ParamByName('id_conta').AsString := IDConta;
    Open();
  end;
  with LancamentoZQuery do begin
    Edit();
   SomaD:=0;
   SomaR:=0;
    for I := 1 to RecordCount do begin
      RecNo := I;
     if FieldByName('tipo').AsString = 'R' then begin
         SomaR:=SomaR+FieldByName('valor').AsFloat;
      end else begin
         SomaD:=SomaD+FieldByName('valor').AsFloat;
      end;
    end;
    FieldByName('receita').AsFloat := SomaR;
     FieldByName('despesa').AsFloat := SomaD;
    FieldByName('total').AsFloat := SomaR - SomaD;
    end;
end;

procedure TGerencialData.BuscaContaReceber(DataInicio: string;
  DataFim: string; Tipo: string);
begin
  with ContaReceberZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select nome_pessoa, d.*');
    SQL.Add('FROM duplicata_receber as d, pessoa');
    SQL.Add('WHERE id_cliente=id_pessoa AND data_vencimento>:data_inicio AND data_vencimento<:data_fim');
    if Tipo <> 'T' then begin
      SQL.Add('AND status=:tipo');
      ParamByName('tipo').AsString := Tipo;
    end;
    ParamByName('data_inicio').AsString := DataInicio;
    ParamByName('data_fim').AsString := DataFim;
    Open();
  end;
end;

procedure TGerencialData.BuscaContaPagar(DataInicio: string; DataFim: string;
  Tipo: string);
begin
  with ContaPagarZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('Select p.nome_pessoa, dp.* FROM duplicata_pagar as dp, pessoa as p');
    SQL.Add('WHERE dp.id_fornecedor=p.id_pessoa AND dp.data_vencimento>:data_inicio AND dp.data_vencimento<:data_fim');
    if Tipo <> 'T' then begin
      SQL.Add('AND dp.status=:status');
      ParamByName('status').AsString := Tipo;
    end;
    ParamByName('data_inicio').AsString := DataInicio;
    ParamByName('data_fim').AsString := DataFim;
    Open();
  end;
end;

procedure TGerencialData.BuscaReceitaDespesaAnual(Ano: string);
begin
  with ReceitaDespesaZQuery do begin
    Close();
    SQL.Clear();
    SQL.Add('SELECT sum(valor), Extract(Month from data)as mes, pc.tipo ');
    SQL.Add('FROM plano_conta_movimentacao as pcm, plano_conta as pc');
    SQL.Add('where Extract(Year from data) =:ano AND pc.id_plano_conta=pcm.id_plano_conta');
    SQL.Add('group by Extract(Month from data),Extract(Year from data), pc.tipo');
    ParamByName('ano').AsString := Ano;
    Open();
  end;
end;

initialization
  {$I gerencialdm.lrs}

end.
